package com.wr.rabbitmq.all;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 完整（包含代码创建交换机）  生产者
 */
public class Producer {
    public static void main(String[] args) {
        // 所有的中间件技术都是基于tcp/ip协议基础上构建的新型协议规范，RabbitMq用的是amqp

        // 1、创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.3.101");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("root");
        connectionFactory.setPassword("123456");
        connectionFactory.setVirtualHost("/");
        // 2、创建连接connection
        Channel channel = null;
        Connection connection = null;
        try {
            connection = connectionFactory.newConnection("生产者");
            // 3、通过连接获取通道Channel
            channel = connection.createChannel();  // 获取通道
            // 4、通过创建交换机、声明队列、绑定关系、路由key、发送消息和接受消息
            /**
             * @params1 队列名称
             * @params2 是否需要持久化
             * @params3 排他性，是否独占独立
             * @params4 是否自动删除，消息消费完了是否自动删除
             * @params5 携带附属参数
             */
            // 5、准备消息内容
            String message = "hello rabbitmq";

            // 准备交换机
            String exchangeName = "direct-message-exchange";
            // 交换机类型 direct/fanout/topic/headers
            String exchangeType = "direct";
            // 创建并开启持久化
            channel.exchangeDeclare(exchangeName,exchangeType,true);
            // 定义路由Key
            String key = "course";


            // 定义队列名
            String queueName1 = "queue-message1";
            String queueName2 = "queue-message2";
            String queueName3 = "queue-message3";


            /**
             * @params1 队列名称
             * @params2 是否需要持久化
             * @params3 排他性，是否独占独立
             * @params4 是否自动删除，消息消费完了是否自动删除
             * @params5 携带附属参数  headers队列需要的匹配参数 例如x=1,用map添加
             */
            channel.queueDeclare(queueName1,true,false,false,null); // 声明队列
            channel.queueDeclare(queueName2,true,false,false,null); // 声明队列
            channel.queueDeclare(queueName3,true,false,false,null); // 声明队列

            // 绑定交换机和队列
            // direct模式需要路由key  其他模式不需要
            channel.queueBind(queueName1,exchangeName,"course");
            channel.queueBind(queueName2,exchangeName,"course");
            channel.queueBind(queueName3,exchangeName,"messageOther");

            /**
             * @params1 交换机名称
             * @params2 路由key名称
             * @params3 属性配置
             * @params4 消息
             */
            // 6、发送消息给队列queue
            channel.basicPublish(exchangeName,key,null,message.getBytes());

            System.out.println("发送完毕！");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } finally {
            // 7、关闭连接
            if (channel != null && channel.isOpen()){
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            // 8、关闭通道

            if (connection != null && connection.isOpen()){
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
